#ifndef __OLED_H_
#define __OLED_H_

#include "stdlib.h"

//���MCUͷ�ļ�
#include "stm32g4xx_hal.h"

typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;

// OLEDģʽ����
// 0: 4�ߴ���ģʽ  ��ģ���BS1��BS2����GND��
// 1: ����8080ģʽ ��ģ���BS1��BS2����VCC��
#define OLED_MODE 0
#define HardWareSPI 1 // 0:���spi 1��Ӳ��spi

//-----------------OLED�˿ڶ���----------------

#define OLED_SCLK_Pin GPIO_PIN_5
#define OLED_SCLK_GPIO_Port GPIOA
#define OLED_SDIN_Pin GPIO_PIN_7
#define OLED_SDIN_GPIO_Port GPIOA
#define OLED_RST_Pin GPIO_PIN_6
#define OLED_RST_GPIO_Port GPIOA
#define OLED_DC_Pin GPIO_PIN_0
#define OLED_DC_GPIO_Port GPIOB
#define OLED_CS_Pin GPIO_PIN_4
#define OLED_CS_GPIO_Port GPIOA

//-----------------OLED���ſ���----------------

// CS
#define OLED_CS_Clr() HAL_GPIO_WritePin(OLED_CS_GPIO_Port, OLED_CS_Pin, GPIO_PIN_RESET)
#define OLED_CS_Set() HAL_GPIO_WritePin(OLED_CS_GPIO_Port, OLED_CS_Pin, GPIO_PIN_SET)

// RST
#define OLED_RST_Clr() HAL_GPIO_WritePin(OLED_RST_GPIO_Port, OLED_RST_Pin, GPIO_PIN_RESET)
#define OLED_RST_Set() HAL_GPIO_WritePin(OLED_RST_GPIO_Port, OLED_RST_Pin, GPIO_PIN_SET)

// DC
#define OLED_DC_Clr() HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_RESET)
#define OLED_DC_Set() HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_SET)

// SCLK,D0
#define OLED_SCLK_Clr() HAL_GPIO_WritePin(OLED_SCLK_GPIO_Port, OLED_SCLK_Pin, GPIO_PIN_RESET)
#define OLED_SCLK_Set() HAL_GPIO_WritePin(OLED_SCLK_GPIO_Port, OLED_SCLK_Pin, GPIO_PIN_SET)

// SDIN,D1
#define OLED_SDIN_Clr() HAL_GPIO_WritePin(OLED_SDIN_GPIO_Port, OLED_SDIN_Pin, GPIO_PIN_RESET)
#define OLED_SDIN_Set() HAL_GPIO_WritePin(OLED_SDIN_GPIO_Port, OLED_SDIN_Pin, GPIO_PIN_SET)

// #define OLED_CS 	PBout(15)   //CS
// #define OLED_RST  	PAout(0)	//RST
// #define OLED_RS 	PBout(14)  //DC
// #define OLED_WR 	PBout(10)  //D0
// #define OLED_RD 	PAout(1)  //D1

// //ʹ��4�ߴ��нӿ�ʱʹ��
// #define OLED_SCLK 	PBout(10)
// #define OLED_SDIN 	PAout(1)

#define OLED_CMD 0  //д����
#define OLED_DATA 1 //д����

//��ͼ��������
typedef struct
{
    u16 x[128];
    u16 y[128];
} Oledfuntion_Handler;
extern Oledfuntion_Handler Funtion1;

    // OLED�����ú���
    void
    OLED_WR_Byte(u8 dat, u8 cmd);
void OLED_Display_On(void);
void OLED_Display_Off(void);
void OLED_Refresh_Gram(void);

void OLED_Init(void);
void OLED_Clear(void);
void OLED_Clear_NOupdate(void);
void OLED_DrawPoint(u8 x, u8 y, u8 t);
void OLED_Fill(u8 x1, u8 y1, u8 x2, u8 y2, u8 dot);
void OLED_ShowChar(u8 x, u8 y, u8 chr, u8 size, u8 mode);
void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len, u8 size);
void OLED_ShowString(u8 x, u8 y, const u8 *p, u8 size);
void OLED_Show_Font(u16 x, u16 y, u8 fnum);
void OLED_Show_Image(u8 fnum);

void Show_Str(u16 x, u16 y, u16 width, u16 height, u8 *str, u8 size, u8 mode);
void OLED_Print(u16 x, u16 y, u8 size, const char *format, ...);

u16 LCD_BGR2RGB(u16 c);
void Gui_Circle(u16 X, u16 Y, u16 R, u16 fc);
void Gui_DrawLine(u16 x0, u16 y0, u16 x1, u16 y1, u16 Color);
void Gui_box(u16 x, u16 y, u16 w, u16 h, u16 bc);
void Gui_box2(u16 x, u16 y, u16 w, u16 h, u8 mode);
void DisplayButtonDown(u16 x1, u16 y1, u16 x2, u16 y2);
void DisplayButtonUp(u16 x1, u16 y1, u16 x2, u16 y2);
void Gui_DrawFont_GBK12(u16 x, u16 y, u16 fc, u16 bc, u8 *s);
void Gui_DrawFont_GBK16(u16 x, u16 y, u16 fc, u16 bc, u8 *s);
void Gui_DrawFont_GBK24(u16 x, u16 y, u16 fc, u16 bc, u8 *s);
void Gui_DrawFont_Num32(u16 x, u16 y, u16 fc, u16 bc, u16 num);

void Show_SingalChinese24x24(u16 x, u16 y, u16 fc, u16 bc, u8 *s);
void Show_SingalChinese16x16(u16 x, u16 y, u16 fc, u16 bc, u8 *s);
void Show_SingalChinese12x12(u16 x, u16 y, u16 fc, u16 bc, u8 *s);


void OLED_FuntionInit();
void OLED_DrawPionts(Oledfuntion_Handler *fun, u16 fc);
void OLED_AddFxNum(Oledfuntion_Handler *fun, u8 num);
void OLED_RecordFuntion(Oledfuntion_Handler *fun, u8 num);

#endif
